home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / bipl.zip / PROGS.ZIP / REPLY.ICN < prev    next >
Text File  |  1992-09-28  |  4KB  |  112 lines

  1. ############################################################################
  2. #
  3. #    File:     reply.icn
  4. #
  5. #    Subject:  Program to reply to news-articles or mail
  6. #
  7. #    Author:   Ronald Florence
  8. #
  9. #    Date:     March 8, 1991
  10. #
  11. ###########################################################################
  12. #
  13. #    Version:  1.4
  14. #
  15. ###########################################################################
  16. #
  17. #  This program creates the appropriate headers and attribution, 
  18. #  quotes a news or mail message, and uses system() calls to put the
  19. #  user in an editor and then to mail the reply.  The default prefix 
  20. #  for quoted text is ` > '. 
  21. #
  22. #      usage: reply [prefix] < news-article or mail-item
  23. #
  24. #  If a smarthost is defined, Internet addresses are converted to bang
  25. #  paths (name@site.domain -> site.domain!name).  The mail is routed
  26. #  to a domained smarthost as address@smarthost.domain, otherwise to
  27. #  smarthost!address.
  28. #
  29. #  The default editor can be overridden with the EDITOR environment variable.
  30. #
  31. ############################################################################
  32.  
  33. procedure main(arg)
  34.   local smarthost, editor, console, tmpdir, tmpfile, reply, fullname
  35.   local address, quoter, date, id, subject, newsgroup, refs, edstr, stdin
  36.   local mailstr
  37.   
  38.   smarthost := ""
  39.   editor := "vi"
  40.  
  41.   if find("UNIX", &features) then {
  42.     console := "/dev/tty"
  43.     tmpdir := "/tmp/"
  44.   }
  45.   else if find("MS-DOS", &features) then {
  46.     console := "CON"
  47.     tmpdir := ""
  48.   }
  49.   (\console & \tmpdir) | stop("reply: missing system information")
  50.  
  51.   every tmpfile := tmpdir || "reply." || right(1 to 999,3,"0") do
  52.     close(open(tmpfile)) | break
  53.   reply := open(tmpfile, "w") | stop("reply: cannot write temp file")
  54.  
  55.                 # Case-insensitive matches for headers.
  56.   every !&input ? {
  57.     tab(match("from: " | "reply-to: ", map(&subject))) & {
  58.       if find("<") then {
  59.     fullname := tab(upto('<'))
  60.     address := (move(1), tab(find(">")))
  61.       }
  62.       else {
  63.     address := trim(tab(upto('(') | 0))
  64.     fullname := (move(1), tab(find(")")))
  65.       }
  66.       while match(" ", \fullname, *fullname) do fullname ?:= tab(-1)
  67.       quoter := if *\fullname > 0 then fullname else address
  68.     }
  69.     tab(match("date: ", map(&subject))) & date := tab(0)
  70.     tab(match("message-id: ", map(&subject))) & id := tab(0)
  71.     match("subject: ", map(&subject)) & subject := tab(0)
  72.     match("newsgroups: ", map(&subject)) & newsgroup := tab(upto(',') | 0)
  73.     match("references: ", map(&subject)) & refs := tab(0)
  74.     (\address & *&subject = 0) & {
  75.       \subject & write(reply, subject)
  76.       \newsgroup & write(reply, newsgroup)
  77.       \refs & write(reply, refs, " ", id)
  78.       write(reply, "In-reply-to: ", quoter, "'s message of ", date);
  79.       write(reply, "\nIn ", id, ", ", quoter, " writes:\n")
  80.       break
  81.     }
  82.   }
  83.  
  84.   every write(reply, \arg[1] | " > ", !&input)
  85.   edstr := (getenv("EDITOR") | editor) || " " || tmpfile || " < " || console
  86.   system(edstr)
  87.   stdin := open(console)
  88.   writes("Send y/n? ")
  89.   upto('nN', read(stdin)) & {
  90.     writes("Save your draft reply y/n? ")
  91.     if upto('yY', read(stdin)) then 
  92.       stop("Your draft reply is saved in ", tmpfile)
  93.     else {
  94.       remove(tmpfile)
  95.       stop("Reply aborted.")
  96.     }
  97.   }
  98.  
  99.   (*smarthost > 0) & not find(map(smarthost), map(address)) & {
  100.     find("@", address) & address ? {
  101.       name := tab(upto('@'))
  102.       address := (move(1), tab(upto(' ') | 0)) || "!" || name
  103.     }
  104.     if find(".", smarthost) then address ||:= "@" || smarthost
  105.     else address := smarthost || "!" || address
  106.   }
  107.   mailstr := "mail " || address || " < " || tmpfile
  108.   system(mailstr)
  109.   write("Reply sent to " || address)
  110.   remove(tmpfile)
  111. end
  112.